package negocios;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.TreeSet;

public class Minibook implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	private Grafo<Persona> grafo;
	private HashMap<String,Persona>registrados;
	
	
	private Minibook(){
		this.grafo = new Grafo<Persona>();
		
		// si le paso el mail me devuelve una persona
		this.registrados= new HashMap<String,Persona>();
		
	}
	public static Minibook inicializarMinibook(){
		Minibook m = new Minibook();
		return m;
	}
	
	public void agregarUsuario(String nombre, String email, Integer edad){

		Persona nueva = new Persona(nombre,email,edad);
		grafo.agregarVertice(nueva);
		registrados.put(email, nueva);

	}

	public ArrayList<Persona> getUsuarios() {
		return grafo.todosLosVertices();
	}
	
	public HashMap<String, Persona> getRegistrados() {
		return registrados;
	}
	public boolean estaRegistrado(String email){
		
		boolean ret = grafo.pertenece(registrados.get(email));
		
		return ret ;
	}

	public int getCantidadUsuarios(){
		return grafo.todosLosVertices().size();
	}
	
	
	
	
	public ArrayList<Persona> usuariosMasPopulares(){
		ArrayList<Persona> ret = new ArrayList<Persona>();
		int maximo= 0;
		for(int i = 0; i < getCantidadUsuarios(); i++){
			
			if (getUsuarios().get(i).getCantidadAmigos() > maximo){
				maximo = getUsuarios().get(i).getCantidadAmigos();
			}
		}
		
		for (int j=0; j < getCantidadUsuarios(); j++){
			if (getUsuarios().get(j).getCantidadAmigos() == maximo)
				ret.add(getUsuarios().get(j));
		}
		return ret;
	}
	
	public ArrayList<Persona> usuariosMenosPopulares(){
		
		ArrayList<Persona> ret = new ArrayList<Persona>();
		int minimo= getUsuarios().get(0).getCantidadAmigos();
		
		
		for(int i = 0; i < getUsuarios().size(); i++){
			
			if (getUsuarios().get(i).getCantidadAmigos() < minimo){
				minimo = getUsuarios().get(i).getCantidadAmigos();
			}
		}
		
		for (int j=0; j < getUsuarios().size(); j++){
			if (getUsuarios().get(j).getCantidadAmigos() == minimo)
				ret.add(getUsuarios().get(j));
		}
		
		return ret;
	}

	public ArrayList<Persona> listaDeAmigos(String email){
		
		ArrayList<Persona> ret = new ArrayList<Persona>();
		
		for(Persona p : dameAmigos(registrados.get(email))){
			ret.add(p);
		}
		
		return ret;
	}
	
	private TreeSet<Persona> dameAmigos(Persona p1) {
		return grafo.losVecinos(p1);
	}
	
	
	public void eliminarUsuario(String email){
		
		for(int i = 0; i < listaDeAmigos(email).size(); i++){
			eliminarAmistad(email, listaDeAmigos(email).get(i).getEmail());
		}
		
		grafo.eliminarVertice(registrados.get(email));
		
		registrados.remove(email);
		
		
		
		


	}
	
	public void agregarAmistad(String p1Email, String p2Email ){

		Persona p1 = registrados.get(p1Email);
		Persona p2 = registrados.get(p2Email);
		
		grafo.agregarArista(p1, p2);

		p1.setCantidadAmigos(grafo.grado(registrados.get(p1Email)));
		p2.setCantidadAmigos(grafo.grado(registrados.get(p2Email)));

		grafo.todosLosVertices().set(grafo.iesimoVertice(p1),p1);
		grafo.todosLosVertices().set(grafo.iesimoVertice(p2),p2);
		

		

	}
	
	
	public void eliminarAmistad(String p1Email, String p2Email){
			
		Persona p1 = registrados.get(p1Email);
		Persona p2 = registrados.get(p2Email);
		
		grafo.borrarArista(p1, p2);
		
		p1.setCantidadAmigos(grafo.grado(registrados.get(p1Email)));
		p2.setCantidadAmigos(grafo.grado(registrados.get(p2Email)));

		grafo.todosLosVertices().set(grafo.iesimoVertice(p1), p1);
		grafo.todosLosVertices().set(grafo.iesimoVertice(p2), p2);
		
		


		
	}
	
	public boolean sonAmigos(String p1Email, String p2Email){

			Persona p1 = registrados.get(p1Email);
			Persona p2 = registrados.get(p2Email);

			return grafo.sonVecinos(p1, p2);
	}
	
	public Persona getPersona(String email){
		return registrados.get(email);
		
	}
	
	public Integer getCantidadDeAmigosDe(String email){
		return grafo.grado(registrados.get(email));

	
	}
	
	
	
	

}
